#!/bin/bash

function reducir_tamanio_log()
{
 tam_arch=$1
 let nuevoTamanio="$tam_arch / 2"
 logtmp=$archlog.tmp
 split -C $nuevoTamanio $archlog $logtmp
 rm $archlog
 # se divide el archivo dos partes, se generan dos archivo con nombre $logtmp y sufijo aa y ab
 rm $logtmp"aa"
 mv $logtmp"ab" $archlog
 
 # al indicarse al comando split que no trunque las lineas, puede existir un remanente de informacion en una tercera particion $logtmp"ac"
 if [ -f $logtmp"ac" ];
  then 
   cat $logtmp"ac" >> $archlog
   rm $logtmp"ac"
 fi

 grabar_en_log "Log.sh" "Log Excedido" "I"
}

function controlar_tamanio_log()
{
 tamanio=`stat -c %s $archlog`

 let LOGSIZE_bytes="$LOGSIZE_L * 1024"

 if [ $tamanio -gt $LOGSIZE_bytes ];
  then
#   echo "debe reducirse el tamaño"
   reducir_tamanio_log $tamanio
 fi
}

function verificar_tipo_msg()
{
 res_vtm=1
 for tipo in "I" "W" "E" "SE";
  do
   if [[ $1 == $tipo ]];
    then 
     res_vtm=0
     break
   fi
  done
 return $res_vtm
}

function grabar_en_log()
{
 comando_gl=$1
 mensaje_gl=$2
 tipo_msg_gl=$3

 if [ $loguear_proceso_adicional -eq 1 ];
  then
   comando_gl=$comando_adicional
 fi

 if [ `echo $mensaje_gl | wc -c` -gt "120" ];
  then
   mensaje_gl=`echo ${mensaje_gl:0:120}`
 fi

 fecha_hora=$(date +"%d/%m/%Y-%T")
 usuario=`whoami`
 registro="$fecha_hora-$usuario-$comando_gl-$tipo_msg_gl-$mensaje_gl"
 
 echo $registro >> $archlog
}

function mostrar_msg_error_invocacion()
{
 echo "$1"
 echo "La invocacion debe ser Grabar_L.sh comando [tipo msg] msg [-i] [-p:proceso]"
 echo "tipo msg puede ser I = Informativo, W = Warning, E = Error, SE = Several Error"
 echo "-i indica que se va a loguear una instalacion, el archivo no se va a truncar"
 echo "-p permite definir un proceso que sera el que guarde la entrada corriente en el log. Si no se define, por defecto se usa el nombre del comando pasado como primer parametro del script"
}

function verificar_archivo_carpeta()
{
 eval path=$1
 if [ -d $path -o -f $path ];
  then
   resv_a_c=0
  else
   resv_a_c=1
 fi
 return $resv_a_c
}

function verificar_si_existe_var_de_entorno()
{
 resv_v_e=0
 env | grep -q "$1="
 if [ $? -ne 0 ];
  then
   resv_v_e=1
 fi
 return $resv_v_e
}

function setear_ambiente_para_log()
{
 # se carga inicialimente el path para instalacion, luego si no es una, se setea el nuevo valor
 LOGDIR_L="$PATH_GRUPO/conf"
 # el archivo de instalacion tendra extension log
 LOGEXT_L=log
 #log size sera por defecto 400 kb
 LOGSIZE_L=400
 
 if [ $log_instalacion -ne 1 ];
  then
   # carpetas para log comun, las variables de entorno se suponen inicializadas
   LOGDIR_L=$LOGDIR
   LOGEXT_L=$LOGEXT
   LOGSIZE_L=$LOGSIZE
 fi

 if [ ! -z $LOGDIR_L ];
  then
   mkdir -p $LOGDIR_L
 fi

 archlog=$LOGDIR_L/$comando.$LOGEXT_L
 # se crea el archivo si no existe
 if [ ! -f $archlog ];
  then
   > $archlog
 fi
}

# INICIO DE SCRIPT
# VERIFICACION DE ARGUMENTOS
if [ $# -lt 2 -o $# -gt 5 ];
 then
  mostrar_msg_error_invocacion "Cantidad de argumentos invalida"
  exit 1
fi

PATH_GRUPO=`echo ~/grupo11`
comando=""
comando_adicional=""
archlog=""
log_instalacion=0
loguear_proceso_adicional=0
tipo_msg="I"

vars=""
for par in "$@"
 do
  echo "$par" | grep -q "^-"
   if [ $? -eq 0 ];
    then  # caso en el que es una orden
     #COMANDO INVALIDO
     echo "$par" | grep -q "^-[^i^p]"
     if [ $? -eq 0 ];
      then 
       mostrar_msg_error_invocacion "$par es un comando invalido"      
       exit 1
     fi 

     #INSTALACION 
     echo "$par" | grep -q "^-i$"
      if [ $? -eq 0 ];
       then
        log_instalacion=1
        continue
       else
        echo "$par" | grep -q "^-p"
        if [ $? -ne 0 ] ;
         then
          echo "Error de parametro de instalacion, el comando debe ser solo -i"
          exit 1
        fi
      fi
     #PROCESO ADICIONAL
     echo "$par" | grep -q "^\-[p^i]:." # el comando -p debe contener un valor
      if [ $? -eq 0 ];
       then
        comando_adicional=`echo "$par" | cut -d ":" -f2`
        loguear_proceso_adicional=1
        continue
       else
        echo "El parametro -p debe especificar un valor luego de \":\""
        exit 1
      fi
    else
     vars="$vars;$par"
   fi
 done
 
comando=`echo "$vars" | cut -s -d ";" -f 2`
tipo_msg=`echo "$vars" | cut -s -d ";" -f 3` 
mensaje=`echo "$vars" | cut -s -d ";" -f 4`

if [[ $mensaje == "" ]];
 then
  mensaje=$tipo_msg
  tipo_msg="I"
fi

verificar_tipo_msg $tipo_msg
if [ $? -ne 0 ];
 then
 mostrar_msg_error_invocacion "Tipo de msg invalido"
 exit 2
fi
# FIN VERIFICACION DE ARGUMENTOS 

setear_ambiente_para_log

if [ $log_instalacion -eq 0 ];
 then
  controlar_tamanio_log
fi

#echo "comando: $comando, info: $tipo_msg, msg: $mensaje, LOGSIZE: $LOGSIZE_L, LOGDIR: $LOGDIR_L, LOGEXT: $LOGEXT_L"

grabar_en_log $comando "$mensaje" $tipo_msg

exit 0
